package com.snack.shop.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.snack.shop.dto.CreatePickupOrderParam;
import com.snack.shop.entity.Order;

import java.time.LocalDateTime;
import java.util.Map;

/**
 * 代取订单服务接口
 */
public interface PickupOrderService {

    /**
     * 创建代取订单
     * @param param 订单参数
     * @param userId 用户ID
     * @return 订单ID
     */
    Long createOrder(CreatePickupOrderParam param, Long userId);

    /**
     * 获取订单列表（分页）
     * @param role 角色：publisher-发布方，taker-接单方，merchant-商家
     * @param status 订单状态（可选）
     * @param settlementStatus 结算状态（0-未结算，1-申请中，2-已结算）
     * @param userId 用户ID
     * @param current 当前页
     * @param size 每页大小
     * @return 订单分页列表
     */
    Page<Map<String, Object>> getOrderPage(String role, Integer status, Integer settlementStatus, Long userId, Integer current, Integer size);

    /**
     * 获取可接订单列表
     * @param categoryId 分类ID（可选）
     * @param current 当前页
     * @param size 每页大小
     * @return 可接订单列表
     */
    Page<Map<String, Object>> getAvailableOrders(Long categoryId, Integer current, Integer size);

    /**
     * 获取订单详情
     * @param orderId 订单ID
     * @return 订单详情
     */
    Map<String, Object> getOrderDetail(Long orderId);

    /**
     * 接单
     * @param orderId 订单ID
     * @param userId 用户ID
     */
    void acceptOrder(Long orderId, Long userId);

    /**
     * 确认取件
     * @param orderId 订单ID
     * @param userId 用户ID
     * @param pickupImages 取件照片
     */
    void confirmPickup(Long orderId, Long userId, String pickupImages);

    /**
     * 确认送达
     * @param orderId 订单ID
     * @param userId 用户ID
     * @param deliveryImages 送达照片
     */
    void confirmDeliver(Long orderId, Long userId, String deliveryImages);

    /**
     * 确认收货
     * @param orderId 订单ID
     * @param userId 用户ID
     */
    void confirmReceive(Long orderId, Long userId);

    /**
     * 取消订单
     * @param orderId 订单ID
     * @param userId 用户ID
     * @param reason 取消原因
     */
    void cancelOrder(Long orderId, Long userId, String reason);

    /**
     * 自动确认已送达但超时未确认的订单
     * @param deadline 在此时间之前更新为已送达的订单将被自动确认
     * @return 实际处理的订单数量
     */
    int autoConfirmDeliveredOrders(LocalDateTime deadline);
}

